import axios from 'axios'
import service from '../services/services'
import baseUrl from '../services/baseUrl'

// 循环遍历输出不同的请求方法
let instance = axios.create({
  baseURL: baseUrl.url,
  timeout: 5000
})
const Http = {} // 请求方法的容器
// 请求格式/参数的统一封装
for (let key in service) {
  for (let req in service[key]) {
    // 每个请求里边的参数都包裹在api里边
    let api = service[key][req]
    // 取出每个service里边的方法放在Http里边
    Http[req] = async function (
      params, // axios中的请求参数
      isFormData, // 是否为form-data请求
      config = {} // 配置参数
    ) {
      let newParams = {}
      // 判断请求是否为form-data如果是需要转换请求参数为form-data类型
      if (params && isFormData) {
        newParams = new FormData()
        for (let i in params) {
          newParams.append(i, params[i])
        }
      } else {
        newParams = params
      }
      // 不同请求的判断
      let response = {} // 请求的返回值
      if (api.method === 'put' || api.method === 'post' || api.method === 'patch') {
        try {
          response = await instance[api.method](api.url, newParams, config)
        } catch (err) {
          response = err
        }
      } else if (api.method === 'delete' || api.method === 'get') {
        config.params = newParams
        try {
          response = await instance[api.method](api.url, config)
        } catch (err) {
          response = err
        }
      }
      return response // 返回请求的响应值
    }
  }
}

// 添加请求拦截器
instance.interceptors.request.use(
  config => {
    config.retry = 5
    config.retryDelay = 1000
    // 发起请求
    // TODO 设置请求头信息例如Token
    // 为每个请求添加时间戳
    if (config.method === 'post') {
      config.data = {
        ...config.data,
        _t: Date.parse(new Date()) / 1000
      }
    } else if (config.method === 'get') {
      config.params = {
        _t: Date.parse(new Date()) / 1000,
        ...config.params
      }
    }
    return config
  },
  error => {
    console.log('请求失败' + error)
    // 请求错误
    // TODO 处理错误信息
    console.log(error, '请求错误，请稍后重试')
  }
)
// 添加响应拦截器
instance.interceptors.response.use(
  res => {
    console.log('响应成功' + res)
    // 响应成功
    // console.log('响应成功')
    // 处理响应信息，异常机制处理 返回错误码code  请求成功200
    res = res.data
    if (res.code !== '200') {
        console.log(res.message)
      
      // TODO 设置各类状态码返回信息
      if (res.code === '500') {}
    } else {
      return res
    }
  },
  error => {
    console.log('响应失败' + error)
    const config = error.config
    // 如果配置不存在或未设置重试选项，则返回错误
    if (!config || !config.retry) return Promise.reject(error)
    // 设置用于重试计数的变量
    config.__retryCount = config.__retryCount || 0
    // 是否已经超过设置的次数
    if (config.__retryCount >= config.retry) {
      // 超过的返回错误并且提示错误信息
      // TODO 处理错误响应信息
      console.log(error, '响应错误，请稍后重试') // for debug
      return Promise.reject(error)
    }
    // 重试次数+1
    config.__retryCount += 1
    // 创建新的请求
    const backoff = new Promise(function (resolve) {
      setTimeout(function () {
        resolve()
      }, config.retryDelay || 1)
    })
    // 重新请求
    return backoff.then(function () {
      return instance(config)
    })
  }
)

export default Http
